package org.qqcui.designpattern.patterns.singleton.lazy;

/**
 * 懒汉式，写法三，虽然能够实现懒加载的效果，也能提高创建效率，但是线程不安全，在生产环境不能使用
 *
 * @author cuiqingqiang
 * @version 1.0
 * @date 2020-10-16 21:41
 **/
public class SingletonTest05 {
	public static void main(String[] args) {
		System.out.println("饿懒汉写法三，同步代码块，线程不安全方式");
		Singleton5 instance1 = Singleton5.getInstance();
		Singleton5 instance2 = Singleton5.getInstance();
		System.out.println(instance1 == instance2); // true

		System.out.println("instance1.hashCode=" + instance1.hashCode());
		System.out.println("instance2.hashCode=" + instance2.hashCode());
	}
}

/**
 * 懒汉式单例实现方式一
 * 1.私有的构造方法，防止通过new创建实例
 * 2.私有的静态成员变量
 * 3.在公共获取实例的同步方法中检查成员变量并进行初始化
 */
class Singleton5 {
	/**
	 * 此处私有变量没有添加 volatile 关键字，无法保证可见性和禁止指令重排序
	 * 对于new对象时，JVM层面会分成三个步骤，分配内存，初始化对象，将内存赋值给变量
	 * 如果发生指令重排序，会导致变量引用的对象内存中，对象属性不是完整的，可能仅仅初始化了部分数据
	 */
	private static Singleton5 instance;

	private Singleton5() {

	}

	public static Singleton5 getInstance() {
		if (instance == null) {
			synchronized (Singleton5.class) {
				instance = new Singleton5();
			}
		}
		return instance;
	}
}